﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Transactions;
using Caixa.BLL;
using Caixa.Model.Interface;
using Caixa.Model;
using Caixa.ServiceBinder;
using Caixa.Model.Enum;

namespace Caixa
{
	public partial class Frm_TED : Caixa.Frm_Base
	{
		#region " Constructor "

		public Frm_TED()
		{
			InitializeComponent();
		}

		#endregion

		#region " Events "

		private void Frm_TED_Load(object sender, EventArgs e)
		{
			CarregaFavorecidoPessoaFisica();
		}

		private void rdbTEDTipoFavorecidoFisica_CheckedChanged(object sender, EventArgs e)
		{
			if (rdbTED_TipoFavorecidoFisica.Checked)
			{
				lblTED_CPFCNPJ.Text = "CPF";
				txtTED_CPFCNPJ.Mask = "999,999,999-99";
				CarregaFavorecidoPessoaFisica();
			}
		}

		private void rdbTEDTipoFavorecidoJuridica_CheckedChanged(object sender, EventArgs e)
		{
			if (rdbTED_TipoFavorecidoJuridica.Checked)
			{
				lblTED_CPFCNPJ.Text = "CNPJ";
				txtTED_CPFCNPJ.Mask = "99,999,999/9999-99";
				CarregaFavorecidoPessoaJuridica();
			}
		}

		private void cmbTED_NomeFavorecido_SelectedIndexChanged(object sender, EventArgs e)
		{
			IDestinatarioTransacao destinatarioTransacao = null;
			if (cmbTED_NomeFavorecido.SelectedIndex > -1)
				destinatarioTransacao = (IDestinatarioTransacao)cmbTED_NomeFavorecido.SelectedValue;
			CarregaDestinatarioTela(destinatarioTransacao);
		}

		private void btnConfirmar_Click(object sender, EventArgs e)
		{
			if (!ValidaPreenchimentoCampos())
				return;

			this.Hide();

			bool sucess = false;

			Frm_Processando frm_Processando = new Frm_Processando();
			frm_Processando.Show();
			frm_Processando.Refresh();
			System.Threading.Thread.Sleep(500);

			// Chama o processamento de efetuar o TED
			sucess = EfetuarTED();

			if (sucess)
			{
				frm_Processando.Mensagem = "TED realizado com sucesso!";
				frm_Processando.Visible = false;
				frm_Processando.KeyPreview = true;
				frm_Processando.ShowDialog();
			}
			else
			{
				frm_Processando.Dispose();
				this.Show();
			}
		}

		private void btnCancelar_Click(object sender, EventArgs e)
		{
			this.Close();
		}

		#endregion

		#region " Methods "

		#region " TED "

		private bool EfetuarTED()
		{
			bool success = false;
			Transacao transacao;

			try
			{
				IDestinatarioTransacao destinatarioTransacao;
				double valor;

				using (TransactionScope ts = new TransactionScope())
				{
					// Recupera o Favorecido
					destinatarioTransacao = (IDestinatarioTransacao)cmbTED_NomeFavorecido.SelectedValue;

					// Inclui a transação do TED
					double.TryParse(txtTED_Valor.Text, out valor);
					transacao = ContaBLL.EfetuaTED(CaixaEletronicoBLL.ContaLogada, destinatarioTransacao, DateTime.Now, valor);

					ts.Complete();
				}

				try
				{
					// Envia a transação do TED para o binder que enviará para o respectivo banco
					using (ServiceBinderSoapClient serviceBinder = new ServiceBinderSoapClient())
					{
						int numeroBancoRemetente = BancoBLL.GetByID(CaixaEletronicoBLL.ContaLogada.IDAgencia).Numero;
						int numeroAgenciaRemetente = AgenciaBLL.GetByID(CaixaEletronicoBLL.ContaLogada.IDAgencia).Numero;
						int numeroContaRemetente = CaixaEletronicoBLL.ContaLogada.Numero;

						int numeroBancoDestinatario = BancoBLL.GetByID(destinatarioTransacao.IDBanco).Numero;
						int numeroAgenciaDestinatario = destinatarioTransacao.NumeroAgencia;
						int numeroContaDestinatario = destinatarioTransacao.NumeroConta;

						// Realiza o envio do TED pelo Binder (WebService)
						success = serviceBinder.ProcessaTED(transacao.ID, numeroBancoRemetente, numeroAgenciaRemetente, numeroContaRemetente, numeroBancoDestinatario, numeroAgenciaDestinatario, numeroContaDestinatario, valor);
					}
				}
				catch (Exception e)
				{
					throw e;
				}
				finally
				{
					// Faz o estorno do TED na conta que enviou se o Binder recusar a transação
					if (!success && (transacao != null))
					{
						using (TransactionScope ts = new TransactionScope())
						{
							if (!ContaBLL.DevolveTED(transacao.ID))
								throw new Exception(string.Format("Ocorreu um erro ao efetuar o estorno do TED Nº {0}. Entre em contato com o banco.", transacao.ID));
							ts.Complete();
						}
						throw new Exception(string.Format("O TED Nº {0} foi recusado em seu destino, foi realizado um estorno em sua conta.", transacao.ID));
					}
				}
			}
			catch (Exception e)
			{
				MessageBox.Show(e.Message, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Warning);
			}

			return success;
		}

		#endregion

		#region " Favorecido "

		private void CarregaFavorecidoPessoaFisica()
		{
			List<DestinatarioTransacaoPessoaFisica> list = DestinatarioTransacaoPessoaFisicaBLL.GetByConta(CaixaEletronicoBLL.ContaLogada.ID);
			list.Sort((a, b) => a.Nome.CompareTo(b.Nome));

			cmbTED_NomeFavorecido.DataSource = null;
			cmbTED_NomeFavorecido.Items.Clear();
			cmbTED_NomeFavorecido.DisplayMember = Pessoa.Fields.NOME;
			cmbTED_NomeFavorecido.DataSource = list;
			cmbTED_NomeFavorecido.SelectedIndex = -1;
		}

		private void CarregaFavorecidoPessoaJuridica()
		{
			List<DestinatarioTransacaoPessoaJuridica> list = DestinatarioTransacaoPessoaJuridicaBLL.GetByConta(CaixaEletronicoBLL.ContaLogada.ID);
			list.Sort((a, b) => a.Nome.CompareTo(b.Nome));

			cmbTED_NomeFavorecido.DataSource = null;
			cmbTED_NomeFavorecido.Items.Clear();
			cmbTED_NomeFavorecido.DisplayMember = Pessoa.Fields.NOME;
			cmbTED_NomeFavorecido.DataSource = list;
			cmbTED_NomeFavorecido.SelectedIndex = -1;
		}

		private void CarregaDestinatarioTela(IDestinatarioTransacao destinatarioTransacao)
		{
			if (destinatarioTransacao != null)
			{
				Banco banco = BancoBLL.GetByID(destinatarioTransacao.IDBanco);
				txtTED_Banco.Text = banco.Numero.ToString();
				txtTED_Agencia.Text = destinatarioTransacao.NumeroAgencia.ToString();
				txtTED_Conta.Text = destinatarioTransacao.NumeroConta.ToString();
				if (destinatarioTransacao.TipoPessoa.Equals(TipoPessoaEnum.Fisica))
					txtTED_CPFCNPJ.Text = ((DestinatarioTransacaoPessoaFisica)destinatarioTransacao).CPF;
				else
					txtTED_CPFCNPJ.Text = ((DestinatarioTransacaoPessoaJuridica)destinatarioTransacao).CNPJ;
			}
			else
			{
				txtTED_Banco.Text = string.Empty;
				txtTED_Agencia.Text = string.Empty;
				txtTED_Conta.Text = string.Empty;
				txtTED_CPFCNPJ.Text = string.Empty;
			}
		}

		#endregion

		#region " Validação "

		public bool ValidaPreenchimentoCampos()
		{
			bool isValid = false;
			try
			{
				if (cmbTED_NomeFavorecido.SelectedIndex < 0)
					throw new Exception("Selecione o favorecido.");

				if (string.IsNullOrEmpty(txtTED_Valor.Text.Trim()))
					throw new Exception("Preencha o valor do TED.");

				isValid = true;
			}
			catch (Exception e)
			{
				isValid = false;
				MessageBox.Show(e.Message, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Warning);
			}

			return isValid;
		}

		#endregion

		#endregion
	}
}
